import greenfoot.*;  // (World, Actor, GreenfootImage, Greenfoot and MouseInfo)

/**
 * Esta clase representa a una imagen de un barco
 * 
 * @author Miguel Martinez Aguilar
 * @version 08 de Mayo del 2013
 */
public abstract class BarcoImg extends ScrollActor
{
    // Declaracion de variables de instancia
    protected GreenfootImage[] img;// es un arreglo de 2 imagenes que representan la posicion horizontal o vertical de el BarcoImg.
    protected boolean revez;// es el boleano que indica la orientacion de esta imagen (horizontal o vertical).
    protected boolean oculto;// es un boleano que indica si esta imagen sera oculta.
    
    /**
     * Constructor de BarcoImg.
     * @param imh: el nombre de una imagen de un barco horizontal.
     * @param imv: el nombre de una imagen de un barco vertical.
     * @param oculto: un boleano que indica si BarcoImg estara oculto.
     */
    public BarcoImg(String imh, String imv, boolean oculto) 
    {
        revez = false;
        this.oculto = oculto;
        img = new GreenfootImage[2];
        img[0] = new GreenfootImage(imh);
        img[1] = new GreenfootImage(imv);
    }
    
    /**
     * Este metodo modifica la verticalidad de este barco.
     * @param val: booleano que indica que imagen tomara el barco (la horizontal o la vertival).
     */
    public void vertical(boolean val) 
    {
        if(val)this.setImage(img[1]);
        else this.setImage(img[0]);
    }
    
    /**
     * Este metodo voltea el barco
     */
    public void revez()
    {
        img[0].mirrorHorizontally();
        img[1].mirrorHorizontally();
        (this.getImage()).mirrorHorizontally();
        revez = true;
    }
    
    /**
     * Este metodo oculta un barco
     */
    public void desOcultar()
    {
        if(oculto)(this.getImage()).setTransparency(255);
    }
    
    /**
     * Este metodo calcula el ancho del barco. <p>
     * Regresa un entero.
     * @param a1: un Espacio donde se encuentra este objeto.
     * @param a2: otro Espacio donde se encuentre este objeto.
     * @param largo0: el largo del Espacio a1.
     * @param largo1: el largo del Espacio a2.
     * @param ancho0: el ancho del Espacio a1.
     * @param ancho1: el ancho del Espacio a2.
     */
    public int ubicaBarco(Espacio a1, Espacio a2, int largo0, int largo1, int ancho0, int ancho1)
    {
        int ancho = 0;
        if(revez){
            if(a1.col() == a2.col()){
                ancho = (a2.getX() + (ancho1/2)) - (a1.getX() - (ancho0/2));//esta bien            
                this.setLocation(a1.getX() - (ancho0/2) + (ancho/2) , a2.getY() + (largo1/2) - (largo0/2));
            }
            else{
                ancho = (a1.getX() + (ancho0/2)) - (a2.getX() - (ancho1/2));//esta bien
                this.setLocation(a2.getX() - (ancho1/2) + (ancho/2) , a2.getY() + (largo1/2) - (largo0/2));
            }
        }
        else{
            if(a1.col() == a2.col()){
                ancho = (a1.getX() + (ancho0/2)) - (a2.getX() - (ancho1/2));//esta bien            
                this.setLocation(a2.getX() - (ancho1/2) + (ancho/2) , a2.getY() + (largo1/2) - (largo0/2));
            }
            else{
                ancho = (a2.getX() + (ancho1/2)) - (a1.getX() - (ancho0/2));//esta bien
                this.setLocation(a1.getX() - (ancho0/2) + (ancho/2) , a2.getY() + (largo1/2) - (largo0/2));
            }
        }
        return ancho;
    }
    
     /**
     * Este metodo abstracto modifica las dimenciones de la imagen del barco para ajustarlas al tablero.
     * @param esp: un arreglo de Espacios donde se ubicara a este objeto.
     */
    public abstract void dimenciones(Espacio[] esp); 
}
